<?php
/**
 * Common_DB 数据库组件
 *
 * @author steven
 * @author seraph.liujb 2009.4.22
 */

class Common_DB
{
	/**
	 * 获取读数据库连接
	 * @return Zend_Db_Adapter_Abstract
	 */
	public static function getRDB()
	{
		$db = new self();
		return $db -> _rdb();
	}

	/**
	 * 获取写数据库连接
	 * @return Zend_Db_Adapter_Abstract
	 */
	public static function getWDB()
	{
		$db = new self();
		return $db -> _wdb();
	}

	/**
	 * 获取读写数据库连接
	 * @return Zend_Db_Adapter_Abstract
	 */
	public static function getDB()
	{
		$db = new self();
		return $db -> _db();
	}

	/**
	 * 获取日志数据库连接
	 * @return Zend_Db_Adapter_Abstract
	 */
	public static function getLogDB()
	{
		$db = new self();
		return $db -> _logdb();
	}

	/**
	 * 建立数据库读连接
	 * @return Zend_Db_Adapter_Abstract
	 */
	private function _rdb()
	{
		return $this->_registerDb('rdb');
	}

	/**
	 * 建立数据库写连接
	 * @return Zend_Db_Adapter_Abstract
	 */
	private function _wdb()
	{
		return $this->_registerDb('wdb');
	}

	/**
	 * 建立数据库读写连接
	 * @return   object
	 */
	private function _db()
	{
		return $this->_registerDb('db');
	}

	/**
	 * 建立数据库连接，专用于log记录
	 * @return Zend_Db_Adapter_Abstract
	 */
	private function _logdb()
	{
		return $this->_registerDb('logdb');
	}

	/**
	 * 读取指定类型数据库配置文件
	 * @param  string $type
	 * @return array
	 * adapater 数据库操作库类型
	 * host 数据库主机
	 * port 端口
	 * username 数据库帐号
	 * password 密码
	 * dbname 数据库名
	 */
	private function getConfig($type) {
		$configPath = APPLICATION_PATH . '/_config';
		if (!file_exists($configPath)) {
			$configPath = APPLICATION_PATH . '/configs';
		}
		$config = new Zend_Config_Ini($configPath . '/system.ini',$type);
		return $config;
	}

	/**
	 * 持久化数据库连接，初始化数据库连接的环境配置
	 * @param $type
	 * @return Zend_Db_Adapter_Abstract
	 */
	private function _registerDb($type = 'db')
	{
		if (Zend_Registry::isRegistered($type)) {
			//已经注册，直接返回
			return Zend_Registry::get($type);
		}
		else {
			//建立连接
			$config = $this->getConfig($type);
			$db = Zend_Db::factory($config->adapter,$config);
			//注册连接
			Zend_Registry::set($type,$db);
			//初始配置
			$this->_initDb($type);
			return $db;
		}
	}

	/**
	 * 初始数据库连接的配置
	 * @param $type db rdb wdb logdb，不同的数据库连接类型
	 * @return Zend_Db_Adapter_Abstract
	 */
	private function _initDb($type)
	{
		$db = Zend_Registry::get($type);
		//切换UTF8
		$db->query("set names 'UTF8';");
		//判断是否开发环境，打开数据库执行统计
		if ('development' == APPLICATION_ENV) {
			$db->getProfiler()->setEnabled(true);
		}
		return $db;
	}

	/**
	 * 获取各数据库连接的Zend_Db_Profile，并返回汇总统计数据值
	 * @return array
	 * dbtype 数据库连接类型
	 * sqlText SQL执行语句
	 * sqlTime SQL执行时间
	 * sqlTimeTotal 执行总时间
	 * sqlCount 执行总数
	 */
	public function getDbProfiler()
	{
		$queryArray = array();
		$this->procProfiler('db', $queryArray);
		$this->procProfiler('rdb', $queryArray);
		$this->procProfiler('wdb', $queryArray);
		return $queryArray;
	}
	private function procProfiler($type, &$queryArray = array())
	{
		switch ($type) {
			case 'rdb' :
				$db = $this->_rdb();
				break;
			case 'wdb' :
				$db = $this->_wdb();
				break;
			default:
				$db = $this->_db();
				break;
		}
		$profiler = $db->getProfiler();
		if (!$profiler->getQueryProfiles()) {
			return $queryArray;
		}
		foreach ($profiler->getQueryProfiles() as $qp) {
			$qm = array();
			$qm['dbType'] = $type;
			$qm['sqlText'] = $qp->getQuery();
			$qm['sqlTime'] = $qp->getElapsedSecs();
			$queryArray[] = $qm;
		}
		//生成total统计
		$queryArray['sqlTimeTotal'] += $profiler->getTotalElapsedSecs();
		$queryArray['sqlCount'] += $profiler->getTotalNumQueries();
	}
}
